Vytvoreni objektu podle jmena tridy (stringoveho)

Otázka od: Karel Kral

4. 12. 2002 11:13

Ahoj,
Myslim, ze se asi pokousim o nesmysl. Nevite nekdo, zda existuje moznost
vytvorit objekt, kdyz znam nazev tridy (TMyClass.ClassName)?

Umim vytvorit tridu podle promenne tridy - ale tu do parametrizacni
databaze neulozim. Tam ulozim tak maximalne string. Samozrejme umim
napsat funkci: if Pole = 'TMyClass' then ... ale hledam elegantni reseni
pokud existuje.

--
______________________________________________________
Karel Kral, vedouci odd. IT / IT dep. manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________

Odpovedá: Delphin

4. 12. 2002 11:38

> Myslim, ze se asi pokousim o nesmysl. Nevite nekdo, zda existuje moznost
> vytvorit objekt, kdyz znam nazev tridy (TMyClass.ClassName)?

Jde to, ale musi se predem definovat mnozina trid, ktere se takto budou
vytvaret.

type TClass=class of TObject;

var MyClasses:array [0..0] of TClass=(TObject);

var i:integer;
     Instance:TObject;
begin
 for i:=low(MyClasses) to high(MyClasses) do if
MyClasses[i].classname='TObject' then
 begin
   Instance:=MyClasses[i].Create;
   ....
 end;
end;

Odpovedá: Ondrej Kelle

4. 12. 2002 12:09

> Nevite nekdo, zda existuje moznost vytvorit objekt,
> kdyz znam nazev tridy (TMyClass.ClassName)?

Existuje, dokonca velmi jednoducha moznost. Vsetky triedy potomkov
TPersistent sa registruju (RegisterClass) kvoli streamovaniu .dfm, takze sa
daju za behu zistit podla mena. Mozes pouzit funkciu GetClass alebo triedu
TClassFinder, vid unitu Classes.
Ak su to triedy odvodene priamo z TObject (teda nie potomkovia TPersistent),
potom si musis vytvorit podobny registracny mechanizmus sam.

HTH
TOndrej

Odpovedá: Petr Vones

4. 12. 2002 16:22

From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
> Existuje, dokonca velmi jednoducha moznost. Vsetky triedy potomkov
> TPersistent sa registruju (RegisterClass) kvoli streamovaniu .dfm, takze sa
> daju za behu zistit podla mena. Mozes pouzit funkciu GetClass alebo triedu
> TClassFinder, vid unitu Classes.

To neni tak docela pravda, pomoci GetClass muzes vytvorit jen objekty, ktere
jsi predtim explicitne registroval pomoci RegisterClasses.

DFM streaming funguje trochu jinak. Kazda komponenta na formulari je z pohledu
formulare jako objektu vlastne published promenna. Prekladac generuje pro tyto
promenne specialni RTTI, tak aby bylo mozne na zaklade instance objektu ve
kterem jsou pouzity (v tomto pripade objektu formulare) vytvorit dane objekty
(komponenty) dle jmena tridy, dale viz metoda TReader.GetFieldClass a funkce
GetFieldClassTable v Classes.pas

Petr Vones

Odpovedá: Ondrej Kelle

4. 12. 2002 16:46

> To neni tak docela pravda, pomoci GetClass muzes vytvorit jen
> objekty, ktere jsi predtim explicitne registroval pomoci
> RegisterClasses.

Pravda. Takze ta aplikacia musi najprv zavolat RegisterClass pre vsetky
triedy, ktore bude chciet neskor vytvarat podla ClassName.

> DFM streaming funguje trochu jinak. Kazda komponenta na
> formulari je z pohledu formulare jako objektu vlastne
> published promenna. Prekladac generuje pro tyto
> promenne specialni RTTI, tak aby bylo mozne na zaklade
> instance objektu ve kterem jsou pouzity (v tomto pripade
> objektu formulare) vytvorit dane objekty (komponenty) dle
> jmena tridy, dale viz metoda TReader.GetFieldClass a funkce
> GetFieldClassTable v Classes.pas

Mas pravdu, je to tak. V tomto omyle zijem uz pomerne dlho, takze vdaka za
opravu.
Ospravedlnujem sa za unahlenu odpoved.
TOndrej

Odpovedá: Jan Sebelík

5. 12. 2002 4:17

> Odesílatel: Ondrej Kelle <O.Kelle@digitalpublishing.de>
> Pravda. Takze ta aplikacia musi najprv zavolat RegisterClass pre vsetky
> triedy, ktore bude chciet neskor vytvarat podla ClassName.

Jasne, tohle nedela problemy.
Jeste by ale bylo dobre u takoveho objektu nastavit podle jmena i properties...
 

Vim, ze to nejak jde, ale nikdy jsem to nezkousel.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Ondrej Kelle

5. 12. 2002 10:30

>> Takze ta aplikacia musi najprv zavolat RegisterClass pre
>> vsetky triedy, ktore bude chciet neskor vytvarat podla
>> ClassName.
>
> Jasne, tohle nedela problemy.
> Jeste by ale bylo dobre u takoveho objektu nastavit podle
> jmena i properties...  
>
> Vim, ze to nejak jde, ale nikdy jsem to nezkousel.

U published properties, pre ktore sa generuje RTTI, je to velmi jednoduche
pomocou SetPropValue v unite TypInfo.

HTH
TOndrej

Odpovedá: Karel Kral

5. 12. 2002 11:00

> Pravda. Takze ta aplikacia musi najprv zavolat RegisterClass pre vsetky
> triedy, ktore bude chciet neskor vytvarat podla ClassName.

Diky, to me uspokojuje. Zaregistruju si vsechny tridy, co budu
potrebovat.
--
______________________________________________________
Karel Kral, vedouci odd. IT / IT dep. manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________